import math
from decimal import Decimal


def step1(mins, wcss, zcss, years, c):
    # 分析历年录取数据与考生位次的关系
    p = 0
    for i in range(years):
        p = p + (wcss[i] / zcss[i])

    p = p / years
    print(f'历年该专业录取最低分对应的位次与当年全省总考生人数的比例平均值：{p}')

    wc = int(p * c)
    print(f'该专业录取最低分对应的位次：{wc}')
    return wc


def step2(wc, d, ndxs, years, k):
    # 考虑试卷难度系数对录取分数和位次的影响
    n = 0
    for i in range(years):
        n = n + (d - float(ndxs[i]))
    n = n / years
    print(f'历年试卷难度系数与今年试卷难度系数的差值平均值：{n}')

    wc = wc + k * n
    print(f'难度系数调整后的录取最低位次：{wc}')

    return wc


def step3(b, wc, l, sums, years, c, m):
    # 结合考生位次与调整后的录取最低位次计算录取概率

    # 比较考生位次B和调整后的录取最低位次wc
    if b > wc: # 说明考生位次低于平均水平，录取概率相对较低
        p = l / c
        print(f'说明考生位次低于平均水平，录取概率相对较低,该考生的录取概率为：{p}')
        return p

    s = 0
    for i in range(years):
        s = s + sums[i]
    s = s / years
    print(f'历年录取人数平均值：{s}')

    r = (l - s) / s
    print(f'招生计划变化比例：{r}')
    p = (1 / (1 + math.exp(-m * r))) * (1 - abs((b - wc) / wc))

    return p

if __name__ == '__main__':
    a = 490  # 输入分数
    b = 190  # 位次
    c = 60000  # 考生数
    d = 0.700  # 难度系数
    l = 3  # 专业录取人数
    years = 5  # 最近数据年数
    mins = [525, 525, 525, 525, 525]  # 最近5年最低分 A
    maxs = [650, 660, 670, 680, 690]  # 最近5年最高分 M
    avgs = [527, 527, 527, 527, 527]  # 最近5年平均分 G
    sums = [3, 3, 3, 3, 3]  # 最近5年录取人数 S
    wcss = [11798, 11798, 11798, 11798, 11798]  # 最近5年最低分排名 W
    zcss = [54000, 54000, 50000, 50000, 50000]  # 最近5年总人数 Z
    ndxs = [Decimal('0.699'), Decimal('0.707'), Decimal('0.700'), Decimal('0.702'), Decimal('0.695')]  # 最近5年难度系数 N

    k = 100  # 假设难度系数每变化0.1，录取最低位次相应变化k名，k可以根据经验或者对更多数据的分析确定
    m = 0.1  # 招生计划变化对录取概率的影响系数m 例如，招生计划增加\(10\%\)，录取概率可能增加\(0.1\)等
    wc = 0  # 可能录取的最次位次
    p = 0  # 录取概率
    wc = step1(mins, wcss, zcss, years, c)
    wc = step2(wc, d, ndxs, years, k)
    p = step3(b, wc, l, sums, years, c, m)
    print(f'录取概率为：{p}')
